import store from "@/store";
import axios from "axios";
import router from "@/router";
import { Message } from "element-ui";
import { getTimeStamp } from "./auth";

// 定义超时时间
const TimeOut = 3600;

const service = axios.create({
  //  如果执行 npm run dev 值为 /api 正确
  baseURL: process.env.VUE_APP_BASE_API, // 设置 axios 请求的基础的基础地址
  timeout: 5000 // 定义 5秒超时
}); // 创建一个 axios 的实例

// 添加请求拦截器
//  在请求拦截器中统一注入 token
service.interceptors.request.use(
  function(config) {
    //  如果 token 存在  注入 token
    if (store.getters.token) {
      //  只有在 有 token 的情况下 才有必要检查时间戳是否超时
      if (IsCheckTimeOut()) {
        // 如果它为 true 表示过期了
        // token 没用了 因为超时了
        store.dispatch("user/logout"); // 登出操作
        //  跳转到登录页
        router.push("/login");
        return Promise.reject(new Error("token超时了"));
      }
      config.headers["Authorization"] = `Bearer ${store.getters.token}`;
    }
    return config; // 必须返回配置
  },
  function(error) {
    // console.log(111);
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
service.interceptors.response.use(
  response => {
    // 解构出 axios  为数据默认封装的 data
    const { success, message, data } = response.data;
    // 要根据 success 的成功与否决定下面的操作
    if (success) {
      return data;
    } else {
      // 业务已经错误 不能进 then 应该进 catch
      Message.error(message);
      return Promise.reject(new Error(message));
    }
    // return response;
  },
  function(error) {
    if (
      error.response &&
      error.response.data &&
      error.response.data.code === 1002
    ) {
      // 当 状态码等于 10002 的时候，表示后端告诉我们 token 超时了
      console.log(err.response, "error.response");
      console.log(error.response.data, "error.response.data");
      store.dispatch("user/logout");
      router.push("/login");
    } else {
      Message.error(error.message); // 提示错误信息
    }
    // Message.error(error.message); // 提示错误信息
    return Promise.reject(error); // 返回执行错误  让当前的执行链跳出成功  直接进入 catch
  }
);

//  是否超时
//  超时逻辑 (当前时间 - 缓存的时间) 是否大于 时间差
function IsCheckTimeOut() {
  var currentTime = Date.now(); // 当前时间戳
  var timeStamp = getTimeStamp(); // 缓存时间
  return (currentTime - timeStamp) / 1000 > TimeOut;
}

export default service; // 导出 axios 实例
